﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Entidades.Sistema.Produccion;

namespace Mapping.Sistema.Produccion
{
    public static class MappingDiagramacionProduccion
    {
        public static List<DiagramacionProduccion> ConsultarDiagramacionProduccion()
        {
            try
            {
                SqlCommand cmdDiagramacionProduccions = new SqlCommand();
                cmdDiagramacionProduccions.CommandText = "sp_ConsultarDiagramacionProduccion";
                cmdDiagramacionProduccions.CommandType = System.Data.CommandType.StoredProcedure;
                Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
                cmdDiagramacionProduccions.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();

                SqlDataReader drDiagramacionProduccions = cmdDiagramacionProduccions.ExecuteReader();

                List<DiagramacionProduccion> ColDiagramacionProduccions = new List<DiagramacionProduccion>();

                while (drDiagramacionProduccions.Read())
                {
                    DiagramacionProduccion oDiagramacionProduccion = new DiagramacionProduccion();
                    oDiagramacionProduccion.IdDiagramacionProduccion = Convert.ToInt32(drDiagramacionProduccions["Id_DiagramacionProduccion"]);
                    
                    //Todo-Lucas REVISAR el switch.
                    int estado = Convert.ToInt32(drDiagramacionProduccions["Estado"]);
                    switch (estado)
                    {
                        case 0:
                            oDiagramacionProduccion.Estado = new DiagramacionEstadoCreada(oDiagramacionProduccion);
                            break;
                        case 1:
                            oDiagramacionProduccion.Estado = new DiagramacionEstadoIniciada(oDiagramacionProduccion);
                            break;
                        case 2:
                            oDiagramacionProduccion.Estado = new DiagramacionEstadoEditada(oDiagramacionProduccion);
                            break;
                        case 3:
                            oDiagramacionProduccion.Estado = new DiagramacionEstadoFinalizada(oDiagramacionProduccion);
                            break;
                        case 4:
                            oDiagramacionProduccion.Estado = new DiagramacionEstadoCancelada(oDiagramacionProduccion);
                            break;
                        default:                            
                            break;
                    }
                    
                    oDiagramacionProduccion.Fecha = Convert.ToDateTime(drDiagramacionProduccions["Fecha"]);
                    oDiagramacionProduccion.FechaElaboracion = Convert.ToDateTime(drDiagramacionProduccions["FechaElaboracion"]);
                    oDiagramacionProduccion.FechaCierre = Convert.ToDateTime(drDiagramacionProduccions["FechaCierre"]);
                    oDiagramacionProduccion.FechaEntrega = Convert.ToDateTime(drDiagramacionProduccions["FechaEntrega"]);


                    SqlCommand cmdDiagramacionProduccionEstado = new SqlCommand();
                    cmdDiagramacionProduccionEstado.CommandText = "sp_ConsultarDiagramacionProduccionEstado";
                    cmdDiagramacionProduccionEstado.CommandType = System.Data.CommandType.StoredProcedure;
                    cmdDiagramacionProduccionEstado.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                    cmdDiagramacionProduccionEstado.Parameters.Add("@Id_DiagramacionProduccion", System.Data.SqlDbType.Int).Value = oDiagramacionProduccion.IdDiagramacionProduccion;

                    SqlDataReader drDiagramacionProduccionEstado = cmdDiagramacionProduccionEstado.ExecuteReader();

                    while (drDiagramacionProduccionEstado.Read())
                    {
                        EstadoDiagramacion e = new EstadoDiagramacion();
                        e.Fecha = Convert.ToDateTime(drDiagramacionProduccionEstado["Fecha"]);
                        e.Comentario = drDiagramacionProduccionEstado["Comentario"].ToString();
                        e.IdEstado = Convert.ToInt32(drDiagramacionProduccionEstado["Estado"]);
                        e.Id_Usuario = drDiagramacionProduccionEstado["Id_Usuario"].ToString();
                        oDiagramacionProduccion.AgregarEstado(e);
                    }

                    SqlCommand cmdProduccionProducto = new SqlCommand();
                    cmdProduccionProducto.CommandText = "sp_ConsultarProduccionProducto";
                    cmdProduccionProducto.CommandType = System.Data.CommandType.StoredProcedure;
                    cmdProduccionProducto.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                    cmdProduccionProducto.Parameters.Add("@Id_Diagramacion", System.Data.SqlDbType.Int).Value = oDiagramacionProduccion.IdDiagramacionProduccion;
                    SqlDataReader drProduccionProducto = cmdProduccionProducto.ExecuteReader();

                    while (drProduccionProducto.Read())
                    {
                        ProduccionProducto oProduccionProducto = new ProduccionProducto();
                        oProduccionProducto.IdProduccionProducto = Convert.ToInt16(drProduccionProducto["Id_ProduccionProducto"]);
                        oProduccionProducto.CantidadDemanda = Convert.ToInt16(drProduccionProducto["CantidadDemanda"]);
                        oProduccionProducto.CantidadProducida = Convert.ToInt16(drProduccionProducto["CantidadProducida"]);
                        oProduccionProducto.CantidadExedente = Convert.ToInt16(drProduccionProducto["CantidadExedente"]);
                        oProduccionProducto.Producto = new Entidades.Sistema.Venta.Producto();
                        oProduccionProducto.Producto.IdProducto = Convert.ToInt16(drProduccionProducto["Id_Producto"]);
                        oProduccionProducto.Producto = Mapping.Sistema.Venta.MappingProductos.ConsultarProductoPorClave(oProduccionProducto.Producto.IdProducto);
                        //Se agrega la receta del producto - Lo correcto sería persistrilo al momento de la generación de la diagramación.
                        //Por puede cambiar la receta prederminada.
                        oProduccionProducto.Receta = new Receta();
                        oProduccionProducto.Receta = Mapping.Sistema.Produccion.MappingReceta.ConsultarRecetaPorProducto(oProduccionProducto.Producto.IdProducto);
                        oProduccionProducto.Receta.Producto = oProduccionProducto.Producto;

                        SqlCommand cmdProduccionProductoDetalle = new SqlCommand();
                        cmdProduccionProductoDetalle.CommandText = "sp_ConsultarProduccionProductoDetalle";
                        cmdProduccionProductoDetalle.CommandType = System.Data.CommandType.StoredProcedure;
                        cmdProduccionProductoDetalle.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                        cmdProduccionProductoDetalle.Parameters.Add("@Id_ProduccionProducto", System.Data.SqlDbType.Int).Value = oProduccionProducto.IdProduccionProducto;
                        SqlDataReader drProduccionProductoDetalle = cmdProduccionProductoDetalle.ExecuteReader();

                        while (drProduccionProductoDetalle.Read())
                        { 
                            ProduccionProductoDetalle oProduccionProductoDetalle = new ProduccionProductoDetalle();
                            oProduccionProductoDetalle.IdProduccionProductoDetalle = Convert.ToInt16(drProduccionProductoDetalle["Id_Empleado"]);
                            oProduccionProductoDetalle.CantidadProducir = Convert.ToInt16(drProduccionProductoDetalle["CantidadProducir"]);
                            oProduccionProductoDetalle.Empleado = new Entidades.Sistema.Base.Empleado();
                            oProduccionProductoDetalle.Empleado.IdEmpleado = Convert.ToInt16(drProduccionProductoDetalle["Id_Empleado"]);                            
                            oProduccionProductoDetalle.Empleado = Mapping.Sistema.Base.MappingEmpleado.ConsultarEmpleadoLeerPorClave(oProduccionProductoDetalle.Empleado.IdEmpleado);
                            oProduccionProducto.AgregarDetalle(oProduccionProductoDetalle);
                        }

                        oDiagramacionProduccion.AgregarDetalle(oProduccionProducto);
                    }

                    SqlCommand cmdInsumoNecesario = new SqlCommand();
                    cmdInsumoNecesario.CommandText = "sp_ConsultarInsumoNecesario";
                    cmdInsumoNecesario.CommandType = System.Data.CommandType.StoredProcedure;
                    cmdInsumoNecesario.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                    cmdInsumoNecesario.Parameters.Add("@Id_Diagramacion", System.Data.SqlDbType.Int).Value = oDiagramacionProduccion.IdDiagramacionProduccion;
                    SqlDataReader drInsumoNecesario = cmdInsumoNecesario.ExecuteReader();

                    while (drInsumoNecesario.Read())
                    {
                        InsumoNecesario oInsumoNecesario = new InsumoNecesario();
                        oInsumoNecesario.IdInsumoNecesario = Convert.ToInt16(drInsumoNecesario["Id_InsumoNecesario"]);
                        oInsumoNecesario.Cantidad = Convert.ToInt16(drInsumoNecesario["Cantidad"]);
                        oInsumoNecesario.Insumo = Mapping.Sistema.Produccion.MappingInsumo.ConsultarInsumoPorClave(Convert.ToInt16(drInsumoNecesario["Id_Insumo"]));
                        oDiagramacionProduccion.AgregarInsumo(oInsumoNecesario);
                    }

                    ColDiagramacionProduccions.Add(oDiagramacionProduccion);
                }

                Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");
                return ColDiagramacionProduccions;
            }
            catch (Exception ex)
            {
                throw (ex);
            }
        }
        public static DiagramacionProduccion ConsultarDiagramacionProduccionLeerPorClave(int idDiagramacionProduccion)
        {
            try
            {
                SqlCommand cmdDiagramacionProduccions = new SqlCommand();
                cmdDiagramacionProduccions.CommandText = "sp_ConsultarDiagramacionProduccionLeerPorClave";
                cmdDiagramacionProduccions.CommandType = System.Data.CommandType.StoredProcedure;
                cmdDiagramacionProduccions.Parameters.Add("@Id_DiagramacionProduccion", System.Data.SqlDbType.Int).Value = idDiagramacionProduccion;
                Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
                cmdDiagramacionProduccions.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();

                SqlDataReader drDiagramacionProduccions = cmdDiagramacionProduccions.ExecuteReader();

                DiagramacionProduccion oDiagramacionProduccion = new DiagramacionProduccion();

                while (drDiagramacionProduccions.Read())
                {
                    
                    oDiagramacionProduccion.IdDiagramacionProduccion = Convert.ToInt32(drDiagramacionProduccions["Id_DiagramacionProduccion"]);

                    //Todo-Lucas REVISAR el switch.
                    int estado = Convert.ToInt32(drDiagramacionProduccions["Estado"]);
                    switch (estado)
                    {
                        case 0:
                            oDiagramacionProduccion.Estado = new DiagramacionEstadoCreada(oDiagramacionProduccion);
                            break;
                        case 1:
                            oDiagramacionProduccion.Estado = new DiagramacionEstadoIniciada(oDiagramacionProduccion);
                            break;
                        case 2:
                            oDiagramacionProduccion.Estado = new DiagramacionEstadoEditada(oDiagramacionProduccion);
                            break;
                        case 3:
                            oDiagramacionProduccion.Estado = new DiagramacionEstadoFinalizada(oDiagramacionProduccion);
                            break;
                        case 4:
                            oDiagramacionProduccion.Estado = new DiagramacionEstadoCancelada(oDiagramacionProduccion);
                            break;
                        default:
                            break;
                    }

                    oDiagramacionProduccion.Fecha = Convert.ToDateTime(drDiagramacionProduccions["Fecha"]);
                    oDiagramacionProduccion.FechaElaboracion = Convert.ToDateTime(drDiagramacionProduccions["FechaElaboracion"]);
                    oDiagramacionProduccion.FechaCierre = Convert.ToDateTime(drDiagramacionProduccions["FechaCierre"]);
                    oDiagramacionProduccion.FechaEntrega = Convert.ToDateTime(drDiagramacionProduccions["FechaEntrega"]);


                    SqlCommand cmdDiagramacionProduccionEstado = new SqlCommand();
                    cmdDiagramacionProduccionEstado.CommandText = "sp_ConsultarDiagramacionProduccionEstado";
                    cmdDiagramacionProduccionEstado.CommandType = System.Data.CommandType.StoredProcedure;
                    cmdDiagramacionProduccionEstado.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                    cmdDiagramacionProduccionEstado.Parameters.Add("@Id_DiagramacionProduccion", System.Data.SqlDbType.Int).Value = oDiagramacionProduccion.IdDiagramacionProduccion;

                    SqlDataReader drDiagramacionProduccionEstado = cmdDiagramacionProduccionEstado.ExecuteReader();

                    while (drDiagramacionProduccionEstado.Read())
                    {
                        EstadoDiagramacion e = new EstadoDiagramacion();
                        e.Fecha = Convert.ToDateTime(drDiagramacionProduccionEstado["Fecha"]);
                        e.Comentario = drDiagramacionProduccionEstado["Comentario"].ToString();
                        e.IdEstado = Convert.ToInt32(drDiagramacionProduccionEstado["Estado"]);
                        e.Id_Usuario = drDiagramacionProduccionEstado["Id_Usuario"].ToString();
                        oDiagramacionProduccion.AgregarEstado(e);
                    }

                    SqlCommand cmdProduccionProducto = new SqlCommand();
                    cmdProduccionProducto.CommandText = "sp_ConsultarProduccionProducto";
                    cmdProduccionProducto.CommandType = System.Data.CommandType.StoredProcedure;
                    cmdProduccionProducto.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                    cmdProduccionProducto.Parameters.Add("@Id_Diagramacion", System.Data.SqlDbType.Int).Value = oDiagramacionProduccion.IdDiagramacionProduccion;
                    SqlDataReader drProduccionProducto = cmdProduccionProducto.ExecuteReader();

                    while (drProduccionProducto.Read())
                    {
                        ProduccionProducto oProduccionProducto = new ProduccionProducto();
                        oProduccionProducto.IdProduccionProducto = Convert.ToInt16(drProduccionProducto["Id_ProduccionProducto"]);
                        oProduccionProducto.CantidadDemanda = Convert.ToInt16(drProduccionProducto["CantidadDemanda"]);
                        oProduccionProducto.CantidadProducida = Convert.ToInt16(drProduccionProducto["CantidadProducida"]);
                        oProduccionProducto.CantidadExedente = Convert.ToInt16(drProduccionProducto["CantidadExedente"]);
                        oProduccionProducto.Producto = new Entidades.Sistema.Venta.Producto();
                        oProduccionProducto.Producto.IdProducto = Convert.ToInt16(drProduccionProducto["Id_Producto"]);
                        oProduccionProducto.Producto = Mapping.Sistema.Venta.MappingProductos.ConsultarProductoPorClave(oProduccionProducto.Producto.IdProducto);
                        //Se agrega la receta del producto - Lo correcto sería persistrilo al momento de la generación de la diagramación.
                        //Por puede cambiar la receta prederminada.
                        oProduccionProducto.Receta = new Receta();
                        oProduccionProducto.Receta = Mapping.Sistema.Produccion.MappingReceta.ConsultarRecetaPorProducto(oProduccionProducto.Producto.IdProducto);
                        oProduccionProducto.Receta.Producto = oProduccionProducto.Producto;

                        SqlCommand cmdProduccionProductoDetalle = new SqlCommand();
                        cmdProduccionProductoDetalle.CommandText = "sp_ConsultarProduccionProductoDetalle";
                        cmdProduccionProductoDetalle.CommandType = System.Data.CommandType.StoredProcedure;
                        cmdProduccionProductoDetalle.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                        cmdProduccionProductoDetalle.Parameters.Add("@Id_ProduccionProducto", System.Data.SqlDbType.Int).Value = oProduccionProducto.IdProduccionProducto;
                        SqlDataReader drProduccionProductoDetalle = cmdProduccionProductoDetalle.ExecuteReader();

                        while (drProduccionProductoDetalle.Read())
                        {
                            ProduccionProductoDetalle oProduccionProductoDetalle = new ProduccionProductoDetalle();
                            oProduccionProductoDetalle.IdProduccionProductoDetalle = Convert.ToInt16(drProduccionProductoDetalle["Id_Empleado"]);
                            oProduccionProductoDetalle.CantidadProducir = Convert.ToInt16(drProduccionProductoDetalle["CantidadProducir"]);
                            oProduccionProductoDetalle.Empleado = new Entidades.Sistema.Base.Empleado();
                            oProduccionProductoDetalle.Empleado.IdEmpleado = Convert.ToInt16(drProduccionProductoDetalle["Id_Empleado"]);
                            oProduccionProductoDetalle.Empleado = Mapping.Sistema.Base.MappingEmpleado.ConsultarEmpleadoLeerPorClave(oProduccionProductoDetalle.Empleado.IdEmpleado);
                            oProduccionProducto.AgregarDetalle(oProduccionProductoDetalle);
                        }

                        oDiagramacionProduccion.AgregarDetalle(oProduccionProducto);
                    }

                    SqlCommand cmdInsumoNecesario = new SqlCommand();
                    cmdInsumoNecesario.CommandText = "sp_ConsultarInsumoNecesario";
                    cmdInsumoNecesario.CommandType = System.Data.CommandType.StoredProcedure;
                    cmdInsumoNecesario.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                    cmdInsumoNecesario.Parameters.Add("@Id_Diagramacion", System.Data.SqlDbType.Int).Value = oDiagramacionProduccion.IdDiagramacionProduccion;
                    SqlDataReader drInsumoNecesario = cmdInsumoNecesario.ExecuteReader();

                    while (drInsumoNecesario.Read())
                    {
                        InsumoNecesario oInsumoNecesario = new InsumoNecesario();
                        oInsumoNecesario.IdInsumoNecesario = Convert.ToInt16(drInsumoNecesario["Id_InsumoNecesario"]);
                        oInsumoNecesario.Cantidad = Convert.ToInt16(drInsumoNecesario["Cantidad"]);
                        oInsumoNecesario.Insumo = Mapping.Sistema.Produccion.MappingInsumo.ConsultarInsumoPorClave(Convert.ToInt16(drInsumoNecesario["Id_Insumo"]));
                        oDiagramacionProduccion.AgregarInsumo(oInsumoNecesario);
                    }
                }

                Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");
                return oDiagramacionProduccion;
            }
            catch (Exception ex)
            {
                throw (ex);
            }
        }

        public static int AgregarDiagramacionProduccion(DiagramacionProduccion oDiagramacionProduccion)
        {
            SqlCommand cmdDiagramacionProduccion = new SqlCommand();
            cmdDiagramacionProduccion.CommandText = "sp_ModificarDiagramacionProduccion";
            cmdDiagramacionProduccion.CommandType = System.Data.CommandType.StoredProcedure;
            Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
            cmdDiagramacionProduccion.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdDiagramacionProduccion.Parameters.Add("@Id_DiagramacionProduccion", System.Data.SqlDbType.Int).Value = 0;
            cmdDiagramacionProduccion.Parameters.Add("@Estado", System.Data.SqlDbType.VarChar).Value = oDiagramacionProduccion.Estado.idEstado;
            cmdDiagramacionProduccion.Parameters.Add("@Fecha", System.Data.SqlDbType.Date).Value = oDiagramacionProduccion.Fecha;
            cmdDiagramacionProduccion.Parameters.Add("@FechaElaboracion", System.Data.SqlDbType.Date).Value = oDiagramacionProduccion.FechaElaboracion;
            cmdDiagramacionProduccion.Parameters.Add("@FechaCierre", System.Data.SqlDbType.Date).Value = oDiagramacionProduccion.FechaCierre;
            cmdDiagramacionProduccion.Parameters.Add("@FechaEntrega", System.Data.SqlDbType.Date).Value = oDiagramacionProduccion.FechaEntrega;

            var nro = (decimal)cmdDiagramacionProduccion.ExecuteScalar();
            oDiagramacionProduccion.IdDiagramacionProduccion = (int)nro;

            foreach (ProduccionProducto produccionproducto in oDiagramacionProduccion.ProduccionProductos)
            {
                AgregarProduccionProducto(oDiagramacionProduccion.IdDiagramacionProduccion, produccionproducto);
            }

            foreach (InsumoNecesario insumonecesario in oDiagramacionProduccion.InsumosNecesarios)
            {
                SqlCommand cmdInsumoNecesario = new SqlCommand();
                cmdInsumoNecesario.CommandText = "sp_ModificarInsumoNecesario";
                cmdInsumoNecesario.CommandType = System.Data.CommandType.StoredProcedure;
                cmdInsumoNecesario.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                cmdInsumoNecesario.Parameters.Add("@Id_InsumoNecesario", System.Data.SqlDbType.Int).Value = 0;
                cmdInsumoNecesario.Parameters.Add("@Id_Insumo", System.Data.SqlDbType.Int).Value = insumonecesario.Insumo.IdInsumo;
                cmdInsumoNecesario.Parameters.Add("@Cantidad", System.Data.SqlDbType.Int).Value = insumonecesario.Cantidad;
                cmdInsumoNecesario.Parameters.Add("@Id_Diagramacion", System.Data.SqlDbType.Int).Value = oDiagramacionProduccion.IdDiagramacionProduccion;
                var nro2 = (decimal)cmdInsumoNecesario.ExecuteScalar();
                //Todo- agregar este valor
                //InsumoNecesario.IdInsumoNecesario = (int)nro;
            }

            Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");
            return (int)nro;
        }

        public static int ModificarDiagramacionProduccion(DiagramacionProduccion oDiagramacionProduccion)
        {
            SqlCommand cmdDiagramacionProduccion = new SqlCommand();
            cmdDiagramacionProduccion.CommandText = "sp_ModificarDiagramacionProduccion";
            cmdDiagramacionProduccion.CommandType = System.Data.CommandType.StoredProcedure;
            Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
            cmdDiagramacionProduccion.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdDiagramacionProduccion.Parameters.Add("@Id_DiagramacionProduccion", System.Data.SqlDbType.Int).Value = oDiagramacionProduccion.IdDiagramacionProduccion;
            cmdDiagramacionProduccion.Parameters.Add("@Estado", System.Data.SqlDbType.VarChar).Value = oDiagramacionProduccion.Estado.idEstado;
            cmdDiagramacionProduccion.Parameters.Add("@Fecha", System.Data.SqlDbType.Date).Value = oDiagramacionProduccion.Fecha;
            cmdDiagramacionProduccion.Parameters.Add("@FechaElaboracion", System.Data.SqlDbType.Date).Value = oDiagramacionProduccion.FechaElaboracion;
            cmdDiagramacionProduccion.Parameters.Add("@FechaCierre", System.Data.SqlDbType.Date).Value = oDiagramacionProduccion.FechaCierre;
            cmdDiagramacionProduccion.Parameters.Add("@FechaEntrega", System.Data.SqlDbType.Date).Value = oDiagramacionProduccion.FechaEntrega;

            cmdDiagramacionProduccion.ExecuteScalar();

            //Esto lo hago para eliminar todos las asociaciones existentes.
            //Inicio Eliminación
            Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");
            DiagramacionProduccion diagramaciontemp = Mapping.Sistema.Produccion.MappingDiagramacionProduccion.ConsultarDiagramacionProduccion().FirstOrDefault(x => x.IdDiagramacionProduccion == oDiagramacionProduccion.IdDiagramacionProduccion);
            Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");

            foreach (ProduccionProducto produccionproducto in diagramaciontemp.ProduccionProductos)
            {
                EliminarProduccionProductoDetalle(oDiagramacionProduccion.IdDiagramacionProduccion, produccionproducto);
            }

            SqlCommand cmdProduccionProducto = new SqlCommand();
            cmdProduccionProducto.CommandText = "sp_EliminarProduccionProducto";
            cmdProduccionProducto.CommandType = System.Data.CommandType.StoredProcedure;
            cmdProduccionProducto.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdProduccionProducto.Parameters.Add("@Id_Diagramacion", System.Data.SqlDbType.Int).Value = oDiagramacionProduccion.IdDiagramacionProduccion;
            cmdProduccionProducto.ExecuteNonQuery();
            //Fin Eliminación

            foreach (ProduccionProducto produccionproducto in oDiagramacionProduccion.ProduccionProductos)
            {
                AgregarProduccionProducto(oDiagramacionProduccion.IdDiagramacionProduccion, produccionproducto);
            }

            SqlCommand cmdInsumoNecesario = new SqlCommand();
            cmdInsumoNecesario.CommandText = "sp_EliminarInsumoNecesario";
            cmdInsumoNecesario.CommandType = System.Data.CommandType.StoredProcedure;
            cmdInsumoNecesario.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdInsumoNecesario.Parameters.Add("@Id_Diagramacion", System.Data.SqlDbType.Int).Value = oDiagramacionProduccion.IdDiagramacionProduccion;
            cmdInsumoNecesario.ExecuteNonQuery();

            Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");
            return 0;
        }

        private static bool AgregarProduccionProducto(int idDiagramacionProduccion, ProduccionProducto produccionProducto)
        {
            SqlCommand cmdProduccionProducto = new SqlCommand();
            cmdProduccionProducto.CommandText = "sp_ModificarProduccionProducto";
            cmdProduccionProducto.CommandType = System.Data.CommandType.StoredProcedure;
            cmdProduccionProducto.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdProduccionProducto.Parameters.Add("@Id_ProduccionProducto", System.Data.SqlDbType.Int).Value = 0;
            cmdProduccionProducto.Parameters.Add("@Estado", System.Data.SqlDbType.VarChar).Value = ProduccionProducto.States.Creado;
            cmdProduccionProducto.Parameters.Add("@Fecha", System.Data.SqlDbType.Date).Value = DateTime.Today;
            cmdProduccionProducto.Parameters.Add("@CantidadDemanda", System.Data.SqlDbType.Int).Value = produccionProducto.CantidadDemanda;
            cmdProduccionProducto.Parameters.Add("@CantidadExedente", System.Data.SqlDbType.Int).Value = produccionProducto.CantidadExedente;
            cmdProduccionProducto.Parameters.Add("@CantidadProducida", System.Data.SqlDbType.Int).Value = produccionProducto.CantidadProducida;
            cmdProduccionProducto.Parameters.Add("@Id_Diagramacion", System.Data.SqlDbType.Int).Value = idDiagramacionProduccion;
            cmdProduccionProducto.Parameters.Add("@Id_Producto", System.Data.SqlDbType.Int).Value = produccionProducto.Producto.IdProducto;

            var nro = (decimal)cmdProduccionProducto.ExecuteScalar();
            produccionProducto.IdProduccionProducto = (int)nro;

            foreach (ProduccionProductoDetalle det in produccionProducto.Detalle)
            {
                AgregarProduccionProductoDetalle(produccionProducto.IdProduccionProducto, det);
            }

            return true;
        }
        private static bool AgregarProduccionProductoDetalle(int idProduccionProducto, ProduccionProductoDetalle produccionProductoDetalle)
        {
            SqlCommand cmdProduccionProductoDetalle = new SqlCommand();
            cmdProduccionProductoDetalle.CommandText = "sp_ModificarProduccionProductoDetalle";
            cmdProduccionProductoDetalle.CommandType = System.Data.CommandType.StoredProcedure;
            cmdProduccionProductoDetalle.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdProduccionProductoDetalle.Parameters.Add("@Id_ProduccionProductoDetalle", System.Data.SqlDbType.Int).Value = 0;
            cmdProduccionProductoDetalle.Parameters.Add("@Estado", System.Data.SqlDbType.VarChar).Value = ProduccionProducto.States.Creado;
            cmdProduccionProductoDetalle.Parameters.Add("@CantidadProducir", System.Data.SqlDbType.Int).Value = produccionProductoDetalle.CantidadProducir;
            cmdProduccionProductoDetalle.Parameters.Add("@Id_Empleado", System.Data.SqlDbType.Int).Value = produccionProductoDetalle.Empleado.IdEmpleado;
            cmdProduccionProductoDetalle.Parameters.Add("@Id_ProduccionProducto", System.Data.SqlDbType.Int).Value = idProduccionProducto;

            var nro = (decimal)cmdProduccionProductoDetalle.ExecuteScalar();
            produccionProductoDetalle.IdProduccionProductoDetalle = (int)nro;

            return true;
        }

        private static bool EliminarProduccionProductoDetalle(int idDiagramacionProduccion, ProduccionProducto produccionProducto)
        {
            SqlCommand cmdProduccionProductoDetalle = new SqlCommand();
            cmdProduccionProductoDetalle.CommandText = "sp_EliminarProduccionProductoDetalle";
            cmdProduccionProductoDetalle.CommandType = System.Data.CommandType.StoredProcedure;
            cmdProduccionProductoDetalle.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdProduccionProductoDetalle.Parameters.Add("@Id_ProduccionProducto", System.Data.SqlDbType.Int).Value = produccionProducto.IdProduccionProducto;
            cmdProduccionProductoDetalle.ExecuteNonQuery();

            return true;
        }

        public static bool CambiarEstadoDiagramacionProduccion(DiagramacionProduccion oDiagramacionProduccion)
        {
            SqlCommand cmdDiagramacionProduccion = new SqlCommand();
            cmdDiagramacionProduccion.CommandText = "sp_ModificarDiagramacionProduccion";
            cmdDiagramacionProduccion.CommandType = System.Data.CommandType.StoredProcedure;
            Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
            cmdDiagramacionProduccion.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdDiagramacionProduccion.Parameters.Add("@Id_DiagramacionProduccion", System.Data.SqlDbType.Int).Value = oDiagramacionProduccion.IdDiagramacionProduccion;
            cmdDiagramacionProduccion.Parameters.Add("@Estado", System.Data.SqlDbType.VarChar).Value = oDiagramacionProduccion.Estado.idEstado;
            cmdDiagramacionProduccion.Parameters.Add("@Fecha", System.Data.SqlDbType.Date).Value = oDiagramacionProduccion.Fecha;
            cmdDiagramacionProduccion.Parameters.Add("@FechaElaboracion", System.Data.SqlDbType.Date).Value = oDiagramacionProduccion.FechaElaboracion;
            cmdDiagramacionProduccion.Parameters.Add("@FechaCierre", System.Data.SqlDbType.Date).Value = oDiagramacionProduccion.FechaCierre;
            cmdDiagramacionProduccion.Parameters.Add("@FechaEntrega", System.Data.SqlDbType.Date).Value = oDiagramacionProduccion.FechaEntrega;
            cmdDiagramacionProduccion.ExecuteScalar();

            SqlCommand cmdDiagramacionProduccionEstado = new SqlCommand();
            cmdDiagramacionProduccionEstado.CommandText = "sp_AgregarDiagramacionProduccionEstado";
            cmdDiagramacionProduccionEstado.CommandType = System.Data.CommandType.StoredProcedure;
            cmdDiagramacionProduccionEstado.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdDiagramacionProduccionEstado.Parameters.Add("@Id_DiagramacionProduccion", System.Data.SqlDbType.Int).Value = oDiagramacionProduccion.IdDiagramacionProduccion;
            cmdDiagramacionProduccionEstado.Parameters.Add("@Estado", System.Data.SqlDbType.Int).Value = oDiagramacionProduccion.Estados.Last().IdEstado;
            cmdDiagramacionProduccionEstado.Parameters.Add("@Fecha", System.Data.SqlDbType.Date).Value = oDiagramacionProduccion.Estados.Last().Fecha;
            cmdDiagramacionProduccionEstado.Parameters.Add("@Comentario", System.Data.SqlDbType.VarChar).Value = oDiagramacionProduccion.Estados.Last().Comentario;
            cmdDiagramacionProduccionEstado.Parameters.Add("@Id_Usuario", System.Data.SqlDbType.VarChar).Value = oDiagramacionProduccion.Estados.Last().Id_Usuario;
            cmdDiagramacionProduccionEstado.ExecuteScalar();

            Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");

            return true;
        }
    }
}
